package cxydmmszl.chapter08.t121;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * <li style="color: red;">Prob</li>
 * 在行列都排好序的矩阵中找指定的数
 * <li style="color: green;">Desc</li>
 * 给定一个 N×M 的整形矩阵 matrix 和一个整数 K, matrix 的每一行和每一列都是排好序的。
 * 实现一个函数，判断 K 是否在 matrix 中。
 * <br/><br/>[要求]<br/>
 * 时间复杂度为 O(N+M)，额外空间复杂度为 O(1)。
 * <br/><br/>备注：<br/>
 * &emsp;1⩽N,M⩽1000<br/>
 * &emsp;0⩽K,矩阵中的数⩽10^9
 * <li style="color: green;">Input</li>
 * 第一行有三个整数N, M, K
 * 接下来N行，每行M个整数为输入的矩阵
 * <li style="color: green;">Output</li>
 * 若 K 存在于矩阵中输出"Yes"，否则输出"No"
 * <li style="color: blue;">Link</li> CD1
 *
 * @author habitplus
 * @since 2021-10-08 15:47
 */
public class Main {
    static final StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static int nextInt() {
        try {
            st.nextToken();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (int) st.nval;
    }

    public static void main(String[] args) {
        int n = nextInt();
        int m = nextInt();
        int k = nextInt();
        int[][] matrix = new int[n][m];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix[i][j] = nextInt();
            }
        }

        boolean ans = isExist(matrix, k);
        System.out.println(ans ? "Yes" : "No");
    }

    private static boolean isExist(int[][] m, int target) {
        if (m == null || m.length == 0 || m[0].length == 0) {
            return false;
        }


        int r = m.length;
        // 从右上角开始
        int pr = 0, pc = m[0].length - 1;

        while (pr < r && pc >= 0) {
            if (m[pr][pc] > target) {
                // 排除当前列
                pc--;
            } else if (m[pr][pc] < target) {
                // 排除当前行
                pr++;
            } else {
                return true;
            }
        }

        return false;
    }
}
